#include<bits/stdc++.h>
#define endl '\n'
#define debug(x) cerr<<#x<<':'<<x<<endl
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const int N=3e3+5;
int n,m;
char a[N][N];
int l[N][N],r[N][N],u[N][N],d[N][N];
int tree[N];
long long ans;
vector<int> p[N];
int L,R;
int lowbit(int x){
    return x&(-x);
}
void add(int x,int v){
    while(x<=R){
        tree[x]+=v;
        x+=lowbit(x);
    }
}
int ask(int x){
    int res=0;
    while(x>=L){
        res+=tree[x];
        x-=lowbit(x);
    }
    return res;
}
void solve(int xl,int xr,int yl,int yr){
    if(xl>=xr||yl>=yr) return;
    if(xr-xl>yr-yl){
        int mid=(xl+xr)>>1;
        for(int j=yl;j<=yr;j++){
            L=max(xl,u[mid][j]),R=min(xr,d[mid][j]);
            for(int k=L-1;k<=R;k++) tree[k]=0;
            for(int k=L;k<=R;k++){
				if(r[k][j]>j){
					add(k,1);
					if(r[k][j]+1<=yr) p[r[k][j]+1].push_back(k);
				}
            }
            for(int k=j+1;k<=yr;k++){
				for(auto o:p[k]) add(o,-1);
				p[k].clear();
				int cnt1=ask(mid)-ask(max(L,u[mid][k])-1);
                int cnt2=ask(min(R,d[mid][k]))-ask(mid);
				ans+=1ll*cnt1*cnt2; 
			}
        }
        solve(xl,mid,yl,yr);
        solve(mid+1,xr,yl,yr);
    }
    else{
		int mid=(yl+yr)>>1;
		for(int j=xl;j<=xr;j++){
			L=max(l[j][mid],yl),R=min(r[j][mid],yr);
			for(int k=L-1;k<=R;k++) tree[k]=0;
			for(int k=L;k<=R;k++){
                if(d[j][k]>j){
					add(k,1);
					if(d[j][k]+1<=xr) p[d[j][k]+1].push_back(k);
				}
            }
			for(int k=j+1;k<=xr;k++){
				for(auto o:p[k]) add(o,-1);
				p[k].clear();
				int cnt1=ask(mid)-ask(max(l[k][mid],L)-1);
                int cnt2=ask(min(r[k][mid],R))-ask(mid);
				ans+=1ll*cnt1*cnt2; 
			}
		}
		solve(xl,xr,yl,mid);
		solve(xl,xr,mid+1,yr);
	}
}
signed main(){
    freopen("star.in","r",stdin);
    freopen("star.out","w",stdout);
    IOS;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++){
        int lst=1;
        for(int j=1;j<=m;j++){
            if(a[i][j]!=a[i][j+1]){
                for(int k=lst;k<=j;k++) l[i][k]=lst,r[i][k]=j;
                lst=j+1;
            }
        }
    }
    for(int j=1;j<=m;j++){
        int lst=1;
        for(int i=1;i<=n;i++){
            if(a[i][j]!=a[i+1][j]){
                for(int k=lst;k<=i;k++) u[k][j]=lst,d[k][j]=i;
                lst=i+1;
            }
        }
    }
    solve(1,n,1,m);
    cout<<ans;
    return 0;
}